package com.jf3q.front.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jf3q.common.domain.EduSubject;
import com.jf3q.common.mapper.EduSubjectMapper;
import com.jf3q.common.vo.SubjectVo;
import com.jf3q.front.service.SubjectService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 *
 */
@Service
@Slf4j
public class SubjectServiceImpl extends ServiceImpl<EduSubjectMapper, EduSubject>
    implements SubjectService {
    /**
     * //其实有很多查询的方式
     * 1.先查询出一级分类然后循环查二级分类set进去。这种是笨办法，sql语句多
     * 2.自关联查询
     * 3.递归查询（性能最好）
     * @return
     */
    @Override
    public List<SubjectVo> getAllSubject() {
        List<SubjectVo> vos= new ArrayList<>();
        List<EduSubject> list = this.list();//查询所有的分类
        for (EduSubject eduSubject : list) {
            SubjectVo subjectVo = new SubjectVo();
            BeanUtils.copyProperties(eduSubject,subjectVo);
            vos.add(subjectVo);
        }

        //vos  数据库有几条分类数据就有几个 ，二级和一级全都混合在一起
        //递归的方式查   一直自查 直到查不到数据为止
        List<SubjectVo> subjectVos = new ArrayList<>();

        for (SubjectVo treeNode : vos) {
            if ("0".equals(treeNode.getParentId())) {//说明是一级分类
                subjectVos.add(findChildren(treeNode,vos));//就要装填二级分类
            }
        }
        return subjectVos;
    }

    /**
     * 递归查找子节点   自己调用自己
     * @param treeNodes
     * @return
     */
    public static SubjectVo findChildren( SubjectVo subject,List<SubjectVo> treeNodes) {
        subject.setChildren(new ArrayList<>());

        for (SubjectVo it : treeNodes) {
            if(subject.getId().equals(it.getParentId())) {
//                subject.getChildren().add(findChildren(it,treeNodes));//把二级分类挂在一级上面(也可以是三级挂在二级上面以此类推)
                subject.getChildren().add(it);//把二级分类挂在一级上面
                findChildren(it,treeNodes);//根据二级找三级，根据三级找四级，以此类推
            }
        }

        System.out.println(subject.getChildren());
        return subject;
    }

}




